package br.com.localab.equipamentocurso.modelo;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Expression;

public class RepositorioEquipamentoPorCurso implements IRepositorioEquipamentoPorCurso, Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Session s;
	
	public RepositorioEquipamentoPorCurso(Session s) {
		this.s = s;
	}
	
	public void cadastrarEquipamentoPorCurso(EquipamentoPorCurso equipamentoPorCurso) throws EquipamentoPorCursoJaCadastradoException{
		try{
			s.save(equipamentoPorCurso);
		}catch(Exception e){
		  throw	new EquipamentoPorCursoJaCadastradoException(equipamentoPorCurso.getEquipamentoPorCuso_PK().getEquipamento().getNome());
		}
	}
	
	public void editarEquipamentoPorCurso(EquipamentoPorCurso equipamentoPorCurso) throws EquipamentoPorCursoNaoEncontradoException{
		try{
			s.update(equipamentoPorCurso);
		}catch(Exception e){
		  throw	new EquipamentoPorCursoNaoEncontradoException(equipamentoPorCurso.getEquipamentoPorCuso_PK().getEquipamento().getNome());
		}
	}
	
	public EquipamentoPorCurso procurar(EquipamentoPorCuso_PK equipamentoPorCuso_PK) throws EquipamentoPorCursoNaoEncontradoException{
		EquipamentoPorCurso equipamentoPorCurso;
		try{
			equipamentoPorCurso  = (EquipamentoPorCurso) s.load(EquipamentoPorCurso.class, equipamentoPorCuso_PK);
			System.out.println(equipamentoPorCuso_PK.getEquipamento().getNome());
		return equipamentoPorCurso;
		}catch(Exception e){
			throw new EquipamentoPorCursoNaoEncontradoException(equipamentoPorCuso_PK.getEquipamento().getNome());
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<EquipamentoPorCurso> listar(){
		return s.createCriteria(EquipamentoPorCurso.class).list();
	}
	
	@SuppressWarnings("unchecked")
	public List<EquipamentoPorCurso> list(String nomeCampo, boolean valorCampo) {
		Criteria c = s.createCriteria(EquipamentoPorCurso.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(false);
		return c.list();
	}
	
	@SuppressWarnings("unchecked")
	public List<EquipamentoPorCurso> list(String nomeCampo, boolean valorCampo,String nomeCampo2, Long valorCampo2) {
		Criteria c = s.createCriteria(EquipamentoPorCurso.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.add(Expression.eq(nomeCampo2, valorCampo2));
		c.setCacheable(false);
		return c.list();
	}
	
	public EquipamentoPorCurso procurar(String nomeCampo, String valorCampo) throws EquipamentoPorCursoNaoEncontradoException{
		try{
		Criteria c = s.createCriteria(EquipamentoPorCurso.class);
		c.add(Expression.eq(nomeCampo, valorCampo));
		c.setCacheable(true);
		EquipamentoPorCurso equipamentoPorCurso = (EquipamentoPorCurso) c.uniqueResult();
		System.out.println(equipamentoPorCurso.getEquipamentoPorCuso_PK().getEquipamento().getNome());
		return equipamentoPorCurso;
		}catch(Exception e){
			throw new EquipamentoPorCursoNaoEncontradoException(valorCampo);
		}
	}

	@Override
	public void removerEquipamentoPorCurso(
			EquipamentoPorCurso equipamentoPorCurso)
			throws EquipamentoPorCursoNaoEncontradoException {
		try{
			s.delete(equipamentoPorCurso);
		}catch(Exception e){
		  throw	new EquipamentoPorCursoNaoEncontradoException(equipamentoPorCurso.getEquipamentoPorCuso_PK().getEquipamento().getNome());
		}
		
	}
	
}
